package com.ygsj.Utils;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
//gson解析:
public class GsonUtils {
    /*以下三个方法json直接转对象*/
    //1,将Json数据解析成相应的对象
     public static <T> T JsonToObject(String jsonData, Class<T> clazz) {
                 Gson gson = Singleton.getGsonIntance();
                 T result = gson.fromJson(jsonData, clazz);
                 return result;
             }




    //3.1,将Json解析成相应的对象集合,直接转(json本身就是数组,里面是对象);
    public static <T> List<T> jsonToList(String json, final Class<T> clazz) {
        Type type = new TypeToken<ArrayList<JsonObject>>(){}.getType();
        Gson gson = Singleton.getGsonIntance();
        ArrayList<JsonObject> jsonObjects =gson.fromJson(json, type);//1,先转成数组;
        ArrayList<T> arrayList = new ArrayList<>();
        for (JsonObject jsonObject : jsonObjects) {//数组分解后一一添加;
            T t = new Gson().fromJson(jsonObject, clazz);
            arrayList.add(t);
        }
        return arrayList;
    }


/*建议解决复杂的json解析还是走原生的最方便,JsonObject与JsonAarry都是gson的,用起来不如原生的方便*/

    /*json直接就是Array的情况*/
    public static JsonArray getJsonAarry(String json){//json本来就是一个数组,可以直接解析;
        //Json的解析类对象
        JsonParser parser = new JsonParser();
        //将JSON的String 转成一个JsonArray对象
        JsonArray jsonArray = parser.parse(json).getAsJsonArray();
        return jsonArray;
    }

    /*以下是jsonObject中含有数组jsonArray的逐步解析的步骤*/
    //步骤一:json先转成jsonobj
    public  static JsonObject getJsonObject(String json){
        return new JsonParser().parse(json).getAsJsonObject();
    }

    //步骤二:jsonobj中通过key拿到JsonArray;
    public static JsonArray getJSonAarryByKey(JsonObject jsonObject, String key) {//在解析过程通过可以拿到jsonAarry
        //再转JsonArray 加上数据头
        JsonArray jsonArray = jsonObject.getAsJsonArray(key);
        return  jsonArray;
    }

    //步骤三:jsonAarry转普通的AarryList
    public static  <T>List<T> jsonAarryToList(JsonArray jsonArray, Class<T> clazz) {
        ArrayList<T> arrayList = new ArrayList<>();
        Gson gson = Singleton.getGsonIntance();
        Type type = new TypeToken<ArrayList<JsonObject>>(){}.getType();
        ArrayList<JsonObject> jsonObjects =gson.fromJson(jsonArray, type);
        for (JsonObject jsonObject : jsonObjects) {
            T t = new Gson().fromJson(jsonObject, clazz);
            arrayList.add(t);
        }
        return arrayList;
    }


    /*以下是例子*/

    /*{
  "code": 200,
  "msg": "OK",
  "muser": [
    {
      "name": "zhangsan",
      "age": "10",
      "phone": "11111",
      "email": "11111@11.com"
    },
    {
      "name": "lisi",
      "age": "20",
      "phone": "22222",
      "email": "22222@22.com"
    },
    ...
  ]
}*/

    /**
     * 有数据头 复杂数据 截取方式 可能比原生解析会复杂点;
     */
   /* private List<User> parseComplexJArrayByDirect(String json) {
        //拿到JSON字符串
        List<User> userBeanList = new ArrayList<>();

        //拿到数组
        JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
        JsonArray jsonArray = jsonObject.getAsJsonArray("muser");

        //循环遍历数组
        for (JsonElement user : jsonArray) {
            User user = new Gson().fromJson(user, new TypeToken<User>() {
            }.getType());
            //根据条件过滤
            if (Integer.parseInt(user.getAge()) > 30) {
                userBeanList.add(user);
            }
        }
       return userBeanList;
    }*/

  //经过封装改造后的;
   /* private List<User> parseComplexJArrayByDirect(String json) {
        //拿到JSON字符串
        List<User> userBeanList = new ArrayList<>();
        //拿到数组
        JsonObject jsonObject = getJsonObject(json);
        JsonArray jsonArray = getJSonAarryByKey(jsonObject,"muser");
        userBeanList =  jsonAarryToList(jsonArray);
       return userBeanList;
    }*/


}
